package plateau;

import lectureFichier.LectureFichier;
import lectureFichier.LectureFichierException;

/**
 * fabrique de plateaux circulaires
 * 
 * @see FabriquePlateau
 */
public class FabriquePlateauCirculaire implements FabriquePlateau {

	/**
	 * L'objet LectureFichier qui sera utilisé pour lire un fichier
	 */
	private LectureFichier lectureFichier;

	/**
	 * la taille en largeur des plateaux circulaires qui seront créé
	 */
	private int x;

	/**
	 * la taille en hauteur des plateaux circulaires qui seront créé
	 */
	private int y;

	/**
	 * constructeur
	 * 
	 * @param lectureFichier
	 *            LectureFichier qui sera utilisé pour lire un fichier
	 * @param x
	 *            la taille en largeur des plateaux circulaires qui seront créé
	 * @param y
	 *            la taille en hauteur des plateaux circulaires qui seront créé
	 */
	public FabriquePlateauCirculaire(LectureFichier lectureFichier, int y, int x) {
		assert (lectureFichier != null);
		this.lectureFichier = lectureFichier;
		this.y = y;
		this.x = x;
	}

	/**
	 * fabrique un plateau circulaire à partir des information contenu dans un
	 * fichier
	 * 
	 * @param nomFichier
	 *            fichier à lire
	 * @return le plateau fabriqué
	 * @throws LectureFichierException
	 *             exception levée si la lecture du fichier echoue ou si le
	 *             fichier contient une liste de cellule vivante contenant au
	 *             moins une cellule en dehors du plateau.
	 */
	@Override
	public PlateauCirculaire fabriquerPlateau(String nomFichier)
			throws LectureFichierException {
		lectureFichier.chargerFichier(nomFichier);
		PlateauCirculaire plateau;
		try {
			plateau = new PlateauCirculaire(lectureFichier.getListeDeCellules()
					.sort(), lectureFichier.getValeursDeSurvie(),
					lectureFichier.getValeursDeNaissance(), y, x);
		} catch (CelluleHorsPlateauException e) {
			throw new LectureFichierException(
					"au moins une cellule du fichier:" + nomFichier
							+ " est en dehors du plateau");
		}
		return plateau;
	}
}